home *** CD-ROM | disk | FTP | other *** search
/ Euroscene 2 / Euroscene 2.iso / USEFUL / DeliTracker130 / Developer / Developer.run / Examples / SoundFX13.s < prev    next >
Encoding:
Text File  |  1992-09-23  |  11.5 KB  |  604 lines

  1.  
  2.     incdir    "Includes:"
  3.     include    "Misc/DeliPlayer.i"
  4.  
  5. ;
  6. ;
  7.     SECTION Player,Code
  8. ;
  9. ;
  10.  
  11.     PLAYERHEADER PlayerTagArray
  12.  
  13.     dc.b '$VER: SoundFX 1.3 player module V1.0 (03 Sep 92)',0
  14.     even
  15.  
  16. PlayerTagArray
  17.     dc.l    DTP_PlayerVersion,0
  18.     dc.l    DTP_PlayerName,PName
  19.     dc.l    DTP_Creator,CName
  20.     dc.l    DTP_Check2,Chk
  21.     dc.l    DTP_Interrupt,PlaySong
  22.     dc.l    DTP_InitPlayer,InitPlay
  23.     dc.l    DTP_EndPlayer,EndPlay
  24.     dc.l    DTP_InitSound,InitSnd
  25.     dc.l    DTP_EndSound,RemSnd
  26.     dc.l    TAG_DONE
  27.  
  28. *-----------------------------------------------------------------------*
  29. ;
  30. ; Player/Creatorname und lokale Daten
  31.  
  32. PName    dc.b 'SoundFX_1.3',0
  33. CName    dc.b 'Linel Software,',10
  34.     dc.b 'adapted by Delirium',0
  35.     even
  36. fx_songend    dc.l 0
  37.  
  38. *-----------------------------------------------------------------------*
  39. ;
  40. ; Testet auf SoundFX1.3-Modul
  41.  
  42. Chk    move.l    dtg_ChkData(a5),a0
  43.     move.l    60(a0),d0
  44.     subi.l    #"SONG",d0
  45.     rts
  46.  
  47. *-----------------------------------------------------------------------*
  48. ;
  49. ; Init Player
  50.  
  51. InitPlay
  52.     move.l    dtg_AudioAlloc(a5),a0        ; Function
  53.     jsr    (a0)                ; returncode is already set !
  54.     rts
  55.  
  56. *-----------------------------------------------------------------------*
  57. ;
  58. ; End Player
  59.  
  60. EndPlay
  61.     move.l    dtg_AudioFree(a5),a0        ; Function
  62.     jsr    (a0)
  63.     rts
  64.  
  65. *-----------------------------------------------------------------------*
  66. ;
  67. ; Init Sound
  68.  
  69. InitSnd
  70.     moveq    #0,d0
  71.     move.l    dtg_GetListData(a5),a0        ; Function
  72.     jsr    (a0)
  73.     move.l    a0,SongPointer
  74.     move.w    64(a0),dtg_Timer(a5)        ; Geschwindigkeit
  75.     add.l    d0,a0
  76.     move.l    a0,fx_songend
  77.     jsr    StartSound            ; Init Sound
  78.     rts
  79.  
  80. *-----------------------------------------------------------------------*
  81. ;
  82. ; Remove Sound
  83.  
  84. RemSnd
  85.     jsr    PlayDisable            ; End Sound
  86.     rts
  87.  
  88. ;-------------------------------------------------------------------------
  89. ;
  90. ; SoundFX_1.3-Replay
  91.  
  92. ****************************************************************************
  93. *                                       *
  94. *                                       *
  95. *          Sound Abspiel Routine zu Sound FX               *
  96. *                                       *
  97. *               © 1988 LINEL Switzerland                   *
  98. *                                       *
  99. *                                       *
  100. *                                       *
  101. ****************************************************************************
  102.  
  103. ;---------------------------------------------------------------------------
  104.  
  105. StartSound:
  106.     movem.l    d1-d7/a0-a6,-(SP)
  107.  
  108.     move.l    SongPointer(pc),a0    ;Zeiger auf SongDaten
  109.     add    #60,a0            ;Laengentabelle ueberspringen
  110.     move.b    470(a0),AnzPat+1    ;Laenge des Sounds
  111.     move    4(A0),DelayValue     ;Geschwindigkeit
  112.     bsr    SongLen            ;Länge der Songdaten berechnen
  113.     add.l    d0,a0            ;Zur Adresse der Songstr.
  114.     add.w    #600,a0            ;Laenge der SongStr.
  115.     move.l    SongPointer(pc),a2
  116.     lea    Instruments(pc),a1    ;Tabelle auf Samples
  117.     moveq    #14,d7            ;15 Instrumente
  118. CalcIns:
  119.     move.l    a0,(A1)+        ;Startadresse des Instr.
  120.     add.l    (a2)+,a0        ;berechnen un speichern
  121.     dbf    d7,CalcIns
  122.     bsr    PlayInit        ;Loop Bereich setzen
  123.     bsr    PlayEnable        ;Player erlauben
  124.  
  125.     movem.l    (SP)+,d1-d7/a0-a6
  126.     rts
  127.  
  128. ;---------------------------------------------------------------------------
  129.  
  130. SongLen:
  131.     movem.l    d1-d7/a0-a6,-(SP)
  132.     move.l    SongPointer,a0
  133.     lea    532(A0),a0
  134.     move    AnzPat(pc),d2        ;wieviel Positions
  135.     subq    #1,d2            ;für dbf
  136.     moveq    #0,d1
  137.     moveq    #0,d0
  138. SongLenLoop:
  139.     move.b    (a0)+,d0        ;Patternnummer holen
  140.     cmp.b    d0,d1            ;ist es die höchste ?
  141.     bhi.s    LenHigher        ;nein!
  142.     move.b    d0,d1            ;ja
  143. LenHigher:
  144.     dbf    d2,SongLenLoop
  145.     move.l    d1,d0            ;Hoechste BlockNummer nach d0
  146.     addq    #1,d0            ;plus 1
  147.     mulu    #1024,d0        ;Laenge eines Block
  148.     movem.l    (SP)+,d1-d7/a0-a6
  149.     rts
  150.  
  151. ;--------------------------------------------------------------------
  152.  
  153. PlayInit:
  154.     lea    Instruments(pc),a0    ;Zeiger auf instr.Tabelle
  155.     moveq    #14,d7            ;15 Instrumente
  156. InitLoop:    
  157.     move.l    (A0)+,a1        ;Zeiger holen
  158.     cmp.l    fx_songend,a1
  159.     bge.s    InitLoop2
  160.     clr.l    (A1)            ;erstes Longword löschen
  161. InitLoop2:
  162.     dbf    d7,InitLoop
  163.     rts
  164.  
  165. ;-----------------------------------------------------------------------
  166.  
  167. PlayEnable:
  168.     lea    $dff000,a0        ;AMIGA
  169.     move.w    #-1,PlayLock        ;player zulassen
  170.     clr    $a8(A0)            ;Alle Voloumenregs. auf 0
  171.     clr    $b8(A0)
  172.     clr    $c8(a0)
  173.     clr    $d8(a0)
  174.     clr.w    Timer            ;zahler auf 0
  175.     clr.l    TrackPos        ;zeiger auf pos
  176.     clr.l    PosCounter        ;zeiger innehalb des pattern
  177.     rts
  178.  
  179. ;----------------------------------------------------------------------
  180.  
  181. PlayDisable:
  182.     lea    $dff000,a0        ;AMIGA
  183.     clr.w    PlayLock        ;player sperren
  184.     clr    $a8(a0)            ;volumen auf 0
  185.     clr    $b8(a0)
  186.     clr    $c8(a0)
  187.     clr    $d8(a0)
  188.     move.w    #$f,$96(A0)        ;dma sperren
  189.     rts
  190.  
  191. ;----------------------------------------------------------------------
  192. ;
  193. ; hier werden 5 * effekte gespielt und einmal der song
  194.  
  195. PlaySong:                ;HauptAbspielRoutine
  196.     movem.l    d0-d7/a0-a6,-(SP)
  197.     addq.w    #1,Timer        ;zähler erhöhen
  198.     cmp.w    #6,Timer        ;schon 6?
  199.     bne.s    CheckEffects        ;wenn nicht -> effekte
  200.     clr.w    Timer            ;sonst zähler löschen
  201.     bsr     PlaySound        ;und sound spielen
  202. NoPlay:    movem.l    (SP)+,d0-d7/a0-a6
  203.     rts
  204.  
  205. ;-------------------------------------------------------------------
  206. CheckEffects:
  207.     moveq    #3,d7            ;4 kanäle
  208.     lea    StepControl0,a4
  209.     lea    ChannelData0(pc),a6    ;zeiger auf daten für 0
  210.     lea    $dff0a0,a5        ;Kanal 0
  211. EffLoop:
  212.     movem.l    d7/a5,-(SP)
  213.     bsr.s    MakeEffekts        ;Effekt spielen
  214.     movem.l    (Sp)+,d7/a5
  215. NoEff:
  216.     add    #8,a4
  217.     add    #$10,a5            ;nächster Kanal
  218.     add    #22,a6            ;Nächste KanalDaten
  219.     dbf    d7,EffLoop
  220.     movem.l    (a7)+,d0-d7/a0-a6
  221.     rts
  222.  
  223. MakeEffekts:
  224.     move    (A4),d0
  225.     beq.s    NoStep
  226.     bmi.s    StepItUp
  227.     add    d0,2(A4)
  228.     move    2(A4),d0
  229.     move    4(A4),d1
  230.     cmp    d0,d1
  231.     bhi.s    StepOk
  232.     move    d1,d0
  233. StepOk:
  234.     move    d0,6(a5)
  235.     MOVE    D0,2(A4)
  236.     rts
  237.  
  238. StepItUp:
  239.     add    d0,2(A4)
  240.     move    2(A4),d0
  241.     move    4(A4),d1
  242.     cmp    d0,d1
  243.     blt.s    StepOk
  244.     move    d1,d0
  245.     bra.s    StepOk
  246.  
  247.  
  248.  
  249. NoStep:
  250.     move.b    2(a6),d0
  251.     and.b    #$0f,d0
  252.     cmp.b    #1,d0
  253.     beq    appreggiato
  254.     cmp.b    #2,d0
  255.     beq    pitchbend
  256. ;    cmp.b    #3,d0
  257. ;    beq    LedOn
  258. ;    cmp.b    #4,d0
  259. ;    beq    LedOff
  260.     cmp.b    #7,d0
  261.     beq.s    SetStepUp
  262.     cmp.b    #8,d0
  263.     beq.s    SetStepDown
  264.     rts
  265.  
  266. LedOn:
  267. ;    bset    #1,$bfe001
  268. ;    rts
  269. LedOff:
  270. ;    bclr    #1,$bfe001
  271. ;    rts
  272.  
  273. SetStepUp:
  274.     moveq    #0,d4
  275. StepFinder:
  276.     clr    (a4)
  277.     move    (A6),2(a4)
  278.     moveq    #0,d2
  279.     move.b    3(a6),d2
  280.     and    #$0f,d2
  281.     tst    d4
  282.     beq.s    NoNegIt
  283.     neg    d2
  284. NoNegIt:    
  285.     move    d2,(a4)
  286.     moveq    #0,d2
  287.     move.b    3(a6),d2
  288.     lsr    #4,d2
  289.     move    (a6),d0
  290.     lea    NoteTable,a0
  291.  
  292. StepUpFindLoop:
  293.     move    (A0),d1
  294.     cmp    #-1,d1
  295.     beq.s    EndStepUpFind
  296.     cmp    d1,d0
  297.     beq.s    StepUpFound
  298.     addq    #2,a0
  299.     bra.s    StepUpFindLoop
  300. StepUpFound:
  301.     lsl    #1,d2
  302.     tst    d4
  303.     bne.s    NoNegStep
  304.     neg    d2
  305. NoNegStep:
  306.     move    (a0,d2.w),d0
  307.     move    d0,4(A4)
  308.     rts
  309.  
  310. EndStepUpFind:
  311.     move    d0,4(A4)
  312.     rts
  313.     
  314. SetStepDown:
  315.     st    d4
  316.     bra.s    StepFinder
  317.  
  318.  
  319. StepControl0:
  320.     dc.l    0,0
  321. StepControl1:
  322.     dc.l    0,0
  323. StepControl2:
  324.     dc.l    0,0
  325. StepControl3:
  326.     dc.l    0,0
  327.  
  328.  
  329. appreggiato:
  330.     lea    ArpeTable,a0
  331.     moveq    #0,d0
  332.     move    Timer,d0
  333.     subq    #1,d0
  334.     lsl    #2,d0
  335.     move.l    (A0,d0.l),a0
  336.     jmp    (A0)
  337.  
  338. Arpe4:    lsl.l    #1,d0
  339.     clr.l    d1
  340.     move.w    16(a6),d1
  341.     lea.l    NoteTable,a0
  342. Arpe5:    move.w    (a0,d0.l),d2
  343.     cmp.w    (a0),d1
  344.     beq.s    Arpe6
  345.     addq.l    #2,a0
  346.     bra.s    Arpe5
  347.  
  348.  
  349.  
  350. Arpe1:    clr.l    d0
  351.     move.b    3(a6),d0
  352.     lsr.b    #4,d0
  353.     bra.s    Arpe4
  354.  
  355.  
  356. Arpe2:    clr.l    d0
  357.     move.b    3(a6),d0
  358.     and.b    #$0f,d0
  359.     bra.s    Arpe4
  360.  
  361. Arpe3:    move.w    16(a6),d2
  362.     
  363. Arpe6:    move.w    d2,6(a5)
  364.     rts
  365.  
  366.  
  367. pitchbend:
  368.     clr.l    d0
  369.     move.b    3(a6),d0
  370.     lsr.b    #4,d0
  371.     tst.b    d0
  372.     beq.s    pitch2
  373.     add.w    d0,(a6)
  374.     move.w    (a6),6(a5)
  375.     rts
  376. pitch2:    clr.l    d0
  377.     move.b    3(a6),d0
  378.     and.b    #$0f,d0
  379.     tst.b    d0
  380.     beq.s    pitch3
  381.     sub.w    d0,(a6)
  382.     move.w    (a6),6(a5)
  383. pitch3:    rts
  384.  
  385.  
  386. ;--------------------------------------------------------------------
  387.  
  388. PlaySound:
  389.     move.l    SongPointer(pc),a0    ;Zeiger auf SongFile
  390.     add    #60,a0            ;Laengentabelle ueberspringen
  391.     move.l    a0,a3
  392.     move.l    a0,a2
  393.     lea    600(A0),a0        ;Zeiger auf BlockDaten
  394.     add    #472,a2            ;zeiger auf Patterntab.
  395.     add    #12,a3            ;zeiger auf Instr.Daten
  396.     move.l    TrackPos(pc),d0        ;Postionzeiger
  397.     clr.l    d1
  398.     move.b    (a2,d0.l),d1        ;dazugehörige PatternNr. holen
  399.     moveq    #10,d7
  400.     lsl.l    d7,d1            ;*1024 / länge eines Pattern
  401.     add.l    PosCounter,d1        ;Offset ins Pattern
  402.     clr.w    DmaCon
  403.     lea    StepControl0,a4
  404.     lea    $dff0a0,a5        ;Zeiger auf Kanal0
  405.     lea    ChannelData0(pc),a6    ;Daten für Kanal0
  406.     moveq    #3,d7            ;4 Kanäle
  407. SoundHandleLoop:
  408.     bsr    PlayNote        ;aktuelle Note spielen
  409.     add    #8,a4
  410.     add.l    #$10,a5            ;nächster Kanal
  411.     add.l    #22,a6            ;nächste Daten
  412.     dbf    d7,SoundHandleLoop    ;4*
  413.     
  414.     move    DmaCon(pc),d0        ;DmaBits
  415.     bset    #15,d0            ;Clear or Set Bit setzen
  416.     move.w    d0,$dff096        ;DMA ein!
  417.  
  418.     move    #300,d0            ;Verzögern (genug für MC68030)
  419. Delay2:
  420.     dbf    d0,Delay2
  421.  
  422.     lea    ChannelData3(pc),a6
  423.     lea    $dff0d0,a5
  424.     moveq    #3,d7
  425. SetRegsLoop:
  426.     move.l    10(A6),(a5)        ;Adresse
  427.     move    14(A6),4(A5)        ;länge
  428. NoSetRegs:
  429.     sub    #22,a6            ;nächste Daten
  430.     sub    #$10,a5            ;nächster Kanal
  431.     dbf    d7,SetRegsLoop
  432.     tst    PlayLock
  433.     beq.s    NoEndPattern
  434.     add.l    #16,PosCounter        ;PatternPos erhöhen
  435.     cmp.l    #1024,PosCounter    ;schon Ende ?
  436.     blt.s    NoEndPattern
  437.  
  438.     clr.l    PosCounter        ;PatternPos löschen
  439.     addq.l    #1,TrackPos        ;Position erhöhen
  440. NoAddPos:
  441.     move.w    AnzPat(pc),d0        ;AnzahlPosition
  442.     move.l    TrackPos(pc),d1        ;Aktuelle Pos
  443.     cmp.w    d0,d1            ;Ende?
  444.     bne.s    NoEndPattern        ;nein!
  445.     clr.l    TrackPos        ;ja/ Sound von vorne
  446. NoEndPattern:
  447.     rts
  448.  
  449.  
  450.  
  451. PlayNote:
  452.     clr.l    (A6)
  453.     tst    PlayLock        ;Player zugellassen ?
  454.     beq.s    NoGetNote        ;
  455.     move.l    (a0,d1.l),(a6)        ;Aktuelle Note holen
  456. NoGetNote:
  457.     addq.l    #4,d1            ;PattenOffset + 4
  458.     clr.l    d2
  459.     cmp    #-3,(A6)        ;Ist Note = 'PIC' ?
  460.     beq    NoInstr2        ;wenn ja -> ignorieren
  461.     move.b    2(a6),d2        ;Instr Nummer holen    
  462.     and.b    #$f0,d2            ;ausmaskieren
  463.     lsr.b    #4,d2            ;ins untere Nibble
  464.     tst.b    d2            ;kein Intrument ?
  465.     beq    NoInstr2        ;wenn ja -> überspringen
  466.     
  467.     clr.l    d3
  468.     lea.l    Instruments(pc),a1    ;Instr. Tabelle
  469.     move.l    d2,d4            ;Instrument Nummer
  470.     subq    #1,d2
  471.     lsl    #2,d2            ;Offset auf akt. Instr.
  472.     mulu    #30,d4            ;Offset Auf Instr.Daten
  473.     move.l    (a1,d2.w),4(a6)        ;Zeiger auf akt. Instr.
  474.     move.w    (a3,d4.l),8(a6)        ;Instr.Länge
  475.     move.w    2(a3,d4.l),18(a6)    ;Volume
  476.     move.w    4(a3,d4.l),d3        ;Repeat
  477.     tst    d3            ;kein Repeat?
  478.     beq.s    NoRepeat        ;Nein!
  479.                     ;Doch!
  480.     
  481.     move.l    4(a6),d2        ;akt. Instr.
  482.     add.l    d3,d2            ;Repeat dazu
  483.     move.l    d2,10(a6)        ;Repeat Instr.
  484.     move.w    6(a3,d4),14(a6)        ;rep laenge
  485.     move.w    18(a6),d3         ;Volume in HardReg.
  486.     bra.s    NoInstr
  487.  
  488. NoRepeat:
  489.     move.l    4(a6),d2        ;Instrument    
  490.     add.l    d3,d2            ;rep Offset
  491.     move.l    d2,10(a6)        ;in Rep. Pos.
  492.     move.w    6(a3,d4.l),14(a6)    ;rep Laenge
  493.     move.w    18(a6),d3         ;Volume in Hardware
  494.  
  495. CheckPic:
  496. NoInstr:
  497.     move.b    2(A6),d2
  498.     and    #$0f,d2
  499.     cmp.b    #5,d2
  500.     beq.s    ChangeUpVolume
  501.     cmp.b    #6,d2
  502.     bne    SetVolume2
  503.     moveq    #0,d2
  504.     move.b    3(A6),d2
  505.     sub    d2,d3        
  506.     tst    d3
  507.     bpl    SetVolume2    
  508.     clr    d3
  509.     bra    SetVolume2
  510. ChangeUpVolume:
  511.     moveq    #0,d2
  512.     move.b    3(A6),d2
  513.     add    d2,d3
  514.     tst    d3
  515.     cmp    #64,d3
  516.     ble    SetVolume2
  517.     move    #64,d3
  518. SetVolume2:
  519.     move    d3,8(A5)
  520.     
  521. NoInstr2:
  522.     cmp    #-3,(A6)        ;Ist Note = 'PIC' ?
  523.     bne.s    NoPic        
  524.     clr    2(A6)            ;wenn ja -> Note auf 0 setzen
  525.     bra.s    NoNote    
  526. NoPic:
  527.     tst    (A6)            ;Note ?
  528.     beq.s    NoNote            ;wenn 0 -> nicht spielen
  529.     
  530.     clr    (a4)
  531.     move.w    (a6),16(a6)        ;eintragen
  532.     move.w    20(a6),$dff096        ;dma abschalten
  533.     move.l    d7,-(SP)
  534.     move    #300,d7            ;genug für MC68030
  535. Delay1:
  536.     dbf    d7,Delay1        ;delay
  537.     move.l    (SP)+,d7
  538.     cmp    #-2,(A6)        ;Ist es 'STP'
  539.     bne.s    NoStop            ;Nein!
  540.     clr    8(A5)
  541.     bra    Super
  542. NoStop:
  543.     move.l    4(a6),0(a5)        ;Intrument Adr.
  544.     move.w    8(a6),4(a5)        ;Länge
  545.     move.w    0(a6),6(a5)        ;Period
  546. Super:
  547.     move.w    20(a6),d0        ;DMA Bit
  548.     or.w    d0,DmaCon        ;einodern
  549. NoNote:
  550.     rts
  551.  
  552. ;--------------------------------------------------------------------
  553. ArpeTable:
  554.     dc.l    Arpe1
  555.     dc.l    Arpe2
  556.     dc.l    Arpe3
  557.     dc.l    Arpe2
  558.     dc.l    Arpe1
  559.  
  560.  
  561. ChannelData0:
  562.     dcb.l    5,0            ;Daten für Note
  563.     dc.w    1            ;DMA - Bit
  564. ChannelData1:    
  565.     dcb.l    5,0            ;u.s.w
  566.     dc.w    2
  567. ChannelData2:    
  568.     dcb.l    5,0            ;etc.
  569.     dc.w    4
  570. ChannelData3:    
  571.     dcb.l    5,0            ;a.s.o
  572.     dc.w    8
  573. Instruments:
  574.     dcb.l    15,0            ;Zeiger auf die 15 Instrumente
  575. PosCounter:
  576.     dc.l    0            ;Offset ins Pattern
  577. TrackPos:
  578.     dc.l    0            ;Position Counter
  579. Timer:
  580.     dc.w    0            ;Zähler 0-5
  581. DmaCon:
  582.     dc.w    0            ;Zwischenspeicher für DmaCon
  583. AnzPat:
  584.     dc.w    1            ;Anzahl Positions
  585. PlayLock:
  586.     dc.w    0            ;Flag fuer 'Sound erlaubt'
  587. DelayValue:
  588.     dc.w    14565
  589. SongPointer:
  590.     dc.l    0
  591.  
  592. even
  593.  
  594. Reserve:
  595.     dc.w    856,856,856,856,856,856,856,856,856,856,856,856
  596. NoteTable:
  597.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453   ;1.Okt
  598.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226   ;2.Okt
  599.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113      ;3.Okt
  600.     dc.w    113,113,113,113,113,113,113,113,113,113,113,113      ;Reserve
  601.     dc.w    -1
  602.  
  603.  
  604.